#include "registrationdialog.h"
#include "ui_registrationdialog.h"
#include <QMessageBox>
#include <QSqlError>
#include <QDebug>

RegistrationDialog::RegistrationDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::RegistrationDialog)
{
    ui->setupUi(this);

    // 设置窗口标题
    setWindowTitle(tr("注册账户"));

    // 限制账号输入长度最大为11
    ui->accountLineEdit->setMaxLength(11);

    // 设置密码框为密码模式
    ui->passwordLineEdit->setEchoMode(QLineEdit::Password);
    ui->confirmPasswordLineEdit->setEchoMode(QLineEdit::Password);

    // 初始化数据库
    if (!initDatabase()) {
        QMessageBox::critical(this, tr("数据库错误"), tr("无法连接到数据库，请检查pro.db是否存在"));
        close();
    }

    // 连接信号槽
    connect(ui->passwordLineEdit, &QLineEdit::textChanged,
            this, &RegistrationDialog::onPasswordTextChanged);
    connect(ui->accountLineEdit, &QLineEdit::textChanged,
            this, &RegistrationDialog::onAccountTextChanged);
    connect(ui->registerButton, &QPushButton::clicked,
            this, &RegistrationDialog::onRegisterButtonClicked);
    connect(ui->cancelButton, &QPushButton::clicked,
            this, &QDialog::reject);
}

RegistrationDialog::~RegistrationDialog()
{
    if (db.isOpen()) {
        db.close();
    }
    delete ui;
}
// 检查密码强度
void RegistrationDialog::onPasswordTextChanged(const QString &password)
{
    // 检查密码强度
    PasswordStrength strength = checkPasswordStrength(password);

    // 更新UI显示密码强度
    switch (strength) {
    case Weak:
        ui->strengthLabel->setText(tr("密码强度: 弱"));
        ui->strengthLabel->setStyleSheet("color: #ff4d4f;"); // 红色
        ui->registerButton->setEnabled(false);
        break;
    case Medium:
        ui->strengthLabel->setText(tr("密码强度: 中"));
        ui->strengthLabel->setStyleSheet("color: #faad14;"); // 黄色
        ui->registerButton->setEnabled(true);
        break;
    case Strong:
        ui->strengthLabel->setText(tr("密码强度: 强"));
        ui->strengthLabel->setStyleSheet("color: #52c41a;"); // 绿色
        ui->registerButton->setEnabled(true);
        break;
    }
}
 // 验证账号
void RegistrationDialog::onRegisterButtonClicked()
{
    QString account = ui->accountLineEdit->text().trimmed();
    QString password = ui->passwordLineEdit->text();
    QString confirmPassword = ui->confirmPasswordLineEdit->text();

    // 验证账号
    if (account.isEmpty()) {
        QMessageBox::warning(this, tr("输入错误"), tr("账号不能为空"));
        return;
    }

    if (account.length() > 11) {
        QMessageBox::warning(this, tr("输入错误"), tr("账号长度不能超过11位"));
        return;
    }

    // 验证密码
    if (password.isEmpty()) {
        QMessageBox::warning(this, tr("输入错误"), tr("密码不能为空"));
        return;
    }

    if (password != confirmPassword) {
        QMessageBox::warning(this, tr("输入错误"), tr("两次输入的密码不一致"));
        return;
    }

    // 检查密码强度
    if (checkPasswordStrength(password) == Weak) {
        QMessageBox::warning(this, tr("密码强度不足"), tr("弱密码无法注册，请使用更强的密码"));
        return;
    }

    // 检查账号是否已存在
    if (isAccountExists(account)) {
        QMessageBox::warning(this, tr("注册失败"), tr("该账号已存在"));
        return;
    }

    // 生成盐值并哈希密码
    QString salt = generateSalt();
    QString hashedPassword = hashPassword(password, salt);

    // 保存到数据库
    if (saveUserToDatabase(account, hashedPassword, salt)) {
        QMessageBox::information(this, tr("注册成功"), tr("账号注册成功！"));
        accept(); // 关闭对话框并返回成功
    } else {
        QMessageBox::critical(this, tr("注册失败"), tr("保存用户信息失败，请重试"));
    }
}
// 可以在这里添加账号实时验证逻辑
void RegistrationDialog::onAccountTextChanged(const QString &account)
{
    // 可以在这里添加账号实时验证逻辑
    if (account.length() > 11) {
        ui->accountWarningLabel->setText(tr("账号长度不能超过11位"));
        ui->accountWarningLabel->setStyleSheet("color: #ff4d4f;");
    } else {
        ui->accountWarningLabel->setText("");
    }
}
// 密码强度检测逻辑
RegistrationDialog::PasswordStrength RegistrationDialog::checkPasswordStrength(const QString &password)
{
    // 密码强度检测逻辑
    int score = 0;

    // 长度检查
    if (password.length() >= 8) score += 1;
    if (password.length() >= 12) score += 1;

    // 包含小写字母
    if (QRegularExpression("[a-z]").match(password).hasMatch()) score += 1;

    // 包含大写字母
    if (QRegularExpression("[A-Z]").match(password).hasMatch()) score += 1;

    // 包含数字
    if (QRegularExpression("[0-9]").match(password).hasMatch()) score += 1;

    // 包含特殊字符
    if (QRegularExpression("[^a-zA-Z0-9]").match(password).hasMatch()) score += 1;

    // 判断强度等级
    if (score < 3) return Weak;
    if (score < 5) return Medium;
    return Strong;
}
// 生成随机盐值
QString RegistrationDialog::generateSalt(int length)
{
    // 生成随机盐值
    const QString possibleCharacters("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()");
    QString salt;

    for(int i = 0; i < length; ++i) {
        int index = QRandomGenerator::global()->bounded(possibleCharacters.length());
        salt.append(possibleCharacters.at(index));
    }

    return salt;
}
// 使用SHA-256加盐哈希密码
QString RegistrationDialog::hashPassword(const QString &password, const QString &salt)
{
    // 使用SHA-256加盐哈希密码
    QString saltedPassword = password + salt;
    QByteArray hash = QCryptographicHash::hash(saltedPassword.toUtf8(), QCryptographicHash::Sha256);
    return hash.toHex();
}
 // 初始化SQLite数据库连接
bool RegistrationDialog::initDatabase()
{
    // 初始化SQLite数据库连接
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("./pro.db");

    if (!db.open()) {
        qDebug() << "数据库打开失败:" << db.lastError().text();
        return false;
    }
    return true;
}
// 检查账号是否已存在
bool RegistrationDialog::isAccountExists(const QString &account)
{
    // 检查账号是否已存在
    QSqlQuery query;
    query.prepare("SELECT id FROM users WHERE account = :account");
    query.bindValue(":account", account);

    if (!query.exec()) {
        qDebug() << "查询账号失败:" << query.lastError().text();
        return false;
    }
    return query.next(); // 如果有结果，说明账号已存在
}
// 保存用户信息到数据库
bool RegistrationDialog::saveUserToDatabase(const QString &account, const QString &hashedPassword, const QString &salt)
{
    // 保存用户信息到数据库
    QSqlQuery query;
    query.prepare("INSERT INTO users (account, password_hash, salt) "
                  "VALUES (:account, :password_hash, :salt)");
    query.bindValue(":account", account);
    query.bindValue(":password_hash", hashedPassword);
    query.bindValue(":salt", salt);

    if (!query.exec()) {
        qDebug() << "插入用户失败:" << query.lastError().text();
        return false;
    }

    return true;
}

